package com.pacifico.telebusca.web.controladores;

import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.displaytag.tags.TableTagParameters;
import org.displaytag.util.ParamEncoder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.pacifico.telebusca.dominio.Empresa;
import com.pacifico.telebusca.dominio.UsuarioEmpresa;
import com.pacifico.telebusca.exception.Errores;
import com.pacifico.telebusca.web.facade.TeleBuscaFacade;
import com.pacifico.telebusca.web.util.Util;

@Controller
public class ControladorUsuarioEmpresa {

	@Autowired
	private TeleBuscaFacade teleBuscaFacade;		
	
	
	@Value("#{telebusca['maximofilas']}")
	private String maxNumber;
	
	private static final String PAGE_PARAM = new ParamEncoder("result").encodeParameterName(TableTagParameters.PARAMETER_PAGE);
	

	@RequestMapping(value = "/buscarusuarioempresas", method = RequestMethod.GET)
	public String buscar(HttpServletRequest request,
			HttpServletResponse response, Model map) {

		List<UsuarioEmpresa> usuariosEmpresas = null;
		try {
			Integer firstResult = null;
			Integer numberoPagina = null;
			String numberoPaginas = request.getParameter(PAGE_PARAM);
			
			
			int total = teleBuscaFacade.buscarContarUsuarioEmpresas();
			if (numberoPaginas != null){
				numberoPagina = Integer.valueOf(numberoPaginas);
				firstResult = (numberoPagina - 1) * Integer.valueOf(maxNumber);	
			}
			
			if (firstResult == null){				
				usuariosEmpresas = teleBuscaFacade.buscarUsuarioEmpresas(0, total);				
			} else {
				usuariosEmpresas = teleBuscaFacade.buscarUsuarioEmpresas(firstResult, Integer.valueOf(maxNumber));
			}
			map.addAttribute("empresasnombres", teleBuscaFacade.listarEmpresas());
			map.addAttribute("maxNumber", Integer.valueOf(maxNumber));
			map.addAttribute("usuariosEmpresas", usuariosEmpresas);
			
			
			if (usuariosEmpresas == null || usuariosEmpresas.isEmpty()){
				map.addAttribute("mensajeempresausuario", Errores.MAP.get("E3001"));	
			}
			
			map.addAttribute("mostrarCrear", null);
			map.addAttribute("mostrarActualizar", null);
			teleBuscaFacade.registrarAuditoria("T0001", "T0003");
		} catch (Exception e) {
			e.printStackTrace();
			
			if (e.getCause()!=null){
				if (e.getCause().getCause()!=null){
					if(!e.getCause().getCause().getMessage().equals("")){
						if(e.getCause().getCause().getMessage().contains("Cannot release connection")||
								e.getCause().getCause().getMessage().contains("Cannot open connection") ||
								e.getCause().getCause().getMessage().contains("JDBC rollback failed")){
							map.addAttribute("error", Errores.MAP.get("E0002"));				
							return "mantenimientousuarioempresa";
						}
					}
				}	
			}
			
			try {				
				teleBuscaFacade.registrarAuditoria("T0028", "T0028");
			} catch (Exception ex) {
				ex.printStackTrace();
			}
			map.addAttribute("mensajeempresausuario", Errores.MAP.get("T0028"));
			return "mantenimientousuarioempresa";
		}
		return "mantenimientousuarioempresa";
	
	}
	
	
	
	@RequestMapping(value = "/mostrarActualizar", method = RequestMethod.GET)
	public String actualizarFormulario(HttpServletRequest request,
			HttpServletResponse response,ModelMap map,
			@RequestParam int codEmpresa, @RequestParam String nombreUsuario,
			@ModelAttribute Empresa empresa)
			throws Exception {
		try {
						
			int[] empresas = null;
			int cont = 0;
			List<UsuarioEmpresa> usuariosEmpresas = null;
			List<Empresa> lista = teleBuscaFacade
					.listarUsuariosyEmpresasAsignadasyPorAsignar(nombreUsuario);			
			empresas = new int[lista.size()];
			Empresa empresaAux = null;
			if (lista != null
					&& lista.size() > 0) {				
				for (Iterator<Empresa> iterator = lista.iterator(); iterator.hasNext();) {
					empresa = (Empresa) iterator.next();
					empresas[cont] = empresa.getCodEmpresa1();
					empresa.setEmpresas(empresas);					
					cont++;
					if(empresa.getUsuario() != null && !"".equals(empresa.getUsuario())){
						empresaAux = empresa; 
					}
				}
			}
			//empresa.setEmpresas(empresas);
			map.addAttribute("mostrarActualizar", "mostrarActualizar");
			map.addAttribute("empresasAsginadas", lista);
			map.addAttribute("empresa", empresaAux);
			
			int total = teleBuscaFacade.buscarContarUsuarioEmpresas();			
			usuariosEmpresas = teleBuscaFacade.buscarUsuarioEmpresas(0, total);
			map.addAttribute("usuariosEmpresas", usuariosEmpresas);
			map.addAttribute("empresasnombres", teleBuscaFacade.listarEmpresas());			
			map.addAttribute("maxNumber", Integer.valueOf(maxNumber));			

			
			teleBuscaFacade.registrarAuditoria("T0025","T0026");
			

		} catch (Exception e) {
			e.printStackTrace();
			if (e.getCause()!=null){
				if (e.getCause().getCause()!=null){
					if(!e.getCause().getCause().getMessage().equals("")){
						if(e.getCause().getCause().getMessage().contains("Cannot release connection")||
								e.getCause().getCause().getMessage().contains("Cannot open connection")||
								e.getCause().getCause().getMessage().contains("JDBC rollback failed")){
							map.addAttribute("error", Errores.MAP.get("E0002"));				
							return "mantenimientousuarioempresa";
						}
					}
				}	
			}
			map.addAttribute("error", e.getMessage());
			teleBuscaFacade.registrarAuditoria("T0025","T0027");
			return "mantenimientousuarioempresa";
		}
		return "mantenimientousuarioempresa";

	}

	@RequestMapping(value = "/actualizarusuarioempresa", method = RequestMethod.POST)
	public String actualizarUsuarioEmpresa(HttpServletRequest request,
			HttpServletResponse response,ModelMap map,
			@ModelAttribute Empresa empresa) {

		try {

			teleBuscaFacade.eliminarUsuarioEmpresaByNombreUsuario(empresa.getUsuario().toLowerCase());

			for (int i = 0; i < empresa.getEmpresas().length; i++) {
				int valor = empresa.getEmpresas()[i];
				UsuarioEmpresa usuarioEmpresa = new UsuarioEmpresa();
				usuarioEmpresa.setCodEmpresa(valor);
				usuarioEmpresa.setCodEmpresa(empresa.getEmpresas()[i]);
				usuarioEmpresa.setFechaCreacion(Util.getDate());
				usuarioEmpresa.setFechaModificacion(Util.getDate());
				usuarioEmpresa.setUsuario(empresa.getUsuario().toLowerCase());
							
				this.teleBuscaFacade.actualizarUsuarioEmpresa(usuarioEmpresa);
			}
			int total = teleBuscaFacade.buscarContarUsuarioEmpresas();			
			List<UsuarioEmpresa> usuariosEmpresas = teleBuscaFacade.buscarUsuarioEmpresas(0, total);
			
			map.addAttribute("usuariosEmpresas", usuariosEmpresas);
			map.addAttribute("maxNumber", Integer.valueOf(maxNumber));
			map.addAttribute("empresasnombres", teleBuscaFacade.listarEmpresas());
			
			map.addAttribute("empresasAsginadas", teleBuscaFacade.listarEmpresas()); 
			
			
			
			
			//map.addAttribute("empresas", empresas);
			map.addAttribute("maxNumber", Integer.valueOf(maxNumber));			
			teleBuscaFacade.registrarAuditoria("T0025","T0026");

		} catch (Exception e) {
			e.printStackTrace();
			if (e.getCause()!=null){
				if (e.getCause().getCause()!=null){
					if(!e.getCause().getCause().getMessage().equals("")){
						if(e.getCause().getCause().getMessage().contains("Cannot release connection")||
								e.getCause().getCause().getMessage().contains("Cannot open connection")||
								e.getCause().getCause().getMessage().contains("JDBC rollback failed")){
							map.addAttribute("error", Errores.MAP.get("E0002"));				
							return "mantenimientousuarioempresa";
						}
					}
				}	
			}
			map.addAttribute("error", e.getMessage());
			teleBuscaFacade.registrarAuditoria("T0025","T0026");
			return "mantenimientousuarioempresa";
		}
		return "mantenimientousuarioempresa";

	}

	@RequestMapping(value = "/mostrarCrear", method = RequestMethod.GET)
	public String crearFormulario(ModelMap map,
			@ModelAttribute UsuarioEmpresa usuarioEmpresa) {
		try {
			map.addAttribute("mostrarCrear", "mostrarCrear");
			map.addAttribute("usuarioEmpresa", usuarioEmpresa);
			
			int total = teleBuscaFacade.buscarContarUsuarioEmpresas();			
			List<UsuarioEmpresa> usuariosEmpresas = teleBuscaFacade.buscarUsuarioEmpresas(0, total);
			
			
			map.addAttribute("maxNumber", Integer.valueOf(maxNumber));
			map.addAttribute("empresasnombres", teleBuscaFacade.listarEmpresas());
			map.addAttribute("empresasAsginadas", teleBuscaFacade.listarEmpresas());
			if (usuariosEmpresas != null && usuariosEmpresas.size() > 0){
				map.addAttribute("usuariosEmpresas", usuariosEmpresas);				
			} else {
				map.addAttribute("mensajeempresausuario", "No Exite empresas registradas para asignar");	
			}			
		} catch (Exception e) {
			e.printStackTrace();
			if (e.getCause()!=null){
				if (e.getCause().getCause()!=null){
					if(!e.getCause().getCause().getMessage().equals("")){
						if(e.getCause().getCause().getMessage().contains("Cannot release connection")||
								e.getCause().getCause().getMessage().contains("Cannot open connection")||
								e.getCause().getCause().getMessage().contains("JDBC rollback failed")){
							map.addAttribute("error", Errores.MAP.get("E0002"));				
							return "mantenimientousuarioempresa";
						}
					}
				}	
			}
			map.addAttribute("error", e.getMessage());
			return "mantenimientousuarioempresa";
		}
		return "mantenimientousuarioempresa";

	}

	@RequestMapping(value = "/crearusuarioempresa", method = RequestMethod.POST)
	public String crearUsuarioEmpresa(ModelMap map,
			@ModelAttribute UsuarioEmpresa usuarioEmpresa) {
		try {						
			List<UsuarioEmpresa> lista = teleBuscaFacade.buscarUsuarioEmpresaByNombreUsuario(usuarioEmpresa.getUsuario().toLowerCase());
			if (lista != null && !lista.isEmpty()){				
				map.addAttribute("mensajeempresausuario", "El usuario a asignar ya existe");
				return "mantenimientousuarioempresa";
			}
			
			UsuarioEmpresa usuarioEmpresaAux =null;
			for (int i = 0; i < usuarioEmpresa.getEmpresas().length; i++) {
				usuarioEmpresaAux = new UsuarioEmpresa();
				usuarioEmpresaAux.setCodEmpresa(usuarioEmpresa.getEmpresas()[i]);
				usuarioEmpresaAux.setFechaCreacion(Util.getDate());
				usuarioEmpresaAux.setFechaModificacion(Util.getDate());
				usuarioEmpresaAux.setUsuario(usuarioEmpresa.getUsuario().toLowerCase());
				usuarioEmpresaAux.setCodEmpresa(usuarioEmpresa.getEmpresas()[i]);
				teleBuscaFacade.guardarUsuarioEmpresa(usuarioEmpresaAux);	
			}			
			int total = teleBuscaFacade.buscarContarUsuarioEmpresas();			
			List<UsuarioEmpresa> usuariosEmpresas = teleBuscaFacade.buscarUsuarioEmpresas(0, total);
					
			map.addAttribute("maxNumber", Integer.valueOf(maxNumber));
			map.addAttribute("empresasnombres", teleBuscaFacade.listarEmpresas());
			map.addAttribute("usuariosEmpresas", usuariosEmpresas);
			teleBuscaFacade.registrarAuditoria("T0025","T0026");
			
		} catch (Exception e) {
			e.printStackTrace();
			if (e.getCause()!=null){
				if (e.getCause().getCause()!=null){
					if(!e.getCause().getCause().getMessage().equals("")){
						if(e.getCause().getCause().getMessage().contains("Cannot release connection")||
								e.getCause().getCause().getMessage().contains("Cannot open connection")||
								e.getCause().getCause().getMessage().contains("JDBC rollback failed")){
							map.addAttribute("error", Errores.MAP.get("E0002"));				
							return "mantenimientousuarioempresa";
						}
					}
				}	
			}
			map.addAttribute("error", e.getMessage());
			teleBuscaFacade.registrarAuditoria("T0025","T0026");
			return "mantenimientousuarioempresa";
		}
		return "mantenimientousuarioempresa";

	}

}
